Reporting API์ ๋ํ ์ฌ์ธต ๋ถ์: ์ค๋ฅ ๋ชจ๋ํฐ๋ง, ์ฑ๋ฅ ๋ถ์, ๊ทธ๋ฆฌ๊ณ ์ ์ธ๊ณ ๊ท๋ชจ์ ๊ฒฌ๊ณ ํ๊ณ ์ ๋ขฐํ ์ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
Reporting API: ํฌ๊ด์ ์ธ ์ค๋ฅ ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
์ค๋๋ ์ ์ญ๋์ ์ธ ์น ํ๊ฒฝ์์ ์ํํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ ์ธ๊ณ ์ฌ์ฉ์๋ค์ ๋น ๋ฅด๊ฒ ๋ก๋๋๊ณ ์ค๋ฅ๊ฐ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ํฉ๋๋ค. Reporting API๋ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น๋ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ๋ชจ๋ํฐ๋งํ๊ณ ํด๊ฒฐํ ์ ์๋ ์ค์ํ ๋๊ตฌ๋ก ๋ถ์ํ์ต๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ Reporting API์ ๊ทธ ๊ธฐ๋ฅ, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๊ฒฌ๊ณ ํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ํ์ํฉ๋๋ค.
Reporting API๋ ๋ฌด์์ธ๊ฐ?
Reporting API๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ํ ์ ํ์ ํด๋ผ์ด์ธํธ ์ธก ์ด๋ฒคํธ๋ฅผ ์ง์ ๋ ์๋ฒ ์๋ํฌ์ธํธ๋ก ๋ณด๊ณ ํ ์ ์๋ ํ์คํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ W3C ์ฌ์์ ๋๋ค. ์ด๋ฌํ ์ด๋ฒคํธ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ: ์กํ์ง ์์ ์์ธ ๋ฐ ๊ตฌ๋ฌธ ์ค๋ฅ.
- ์ฌ์ฉ ์ค๋จ๋ ๊ธฐ๋ฅ: ์ฌ์ฉ ์ค๋จ๋ ์น ํ๋ซํผ ๊ธฐ๋ฅ์ ์ฌ์ฉ.
- ๋ธ๋ผ์ฐ์ ๊ฐ์ : ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์์ ํ๊ฑฐ๋ ๋ณด์ ์ ์ฑ ์ ์ํํ๊ธฐ ์ํ ๋ธ๋ผ์ฐ์ ์กฐ์น.
- ๋คํธ์ํฌ ์ค๋ฅ: ๋ฆฌ์์ค(์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ, ์คํ์ผ์ํธ) ๋ก๋ ์คํจ.
- ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP) ์๋ฐ: CSP ๊ท์น์ ์๋ฐํ๋ ค๋ ์๋.
- ์ถฉ๋ ๋ณด๊ณ ์: ๋ธ๋ผ์ฐ์ ์ถฉ๋์ ๋ํ ์ ๋ณด(๋ธ๋ผ์ฐ์ ์์ ์ง์ํ๋ ๊ฒฝ์ฐ).
๊ธฐ์กด์ ์ค๋ฅ ๋ก๊น ๋ฐฉ๋ฒ๊ณผ ๋ฌ๋ฆฌ, Reporting API๋ ์ด๋ฌํ ๋ณด๊ณ ์๋ฅผ ์์งํ๋ ๊ตฌ์กฐํ๋๊ณ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์ ์ฑ๋ฅ์ ๋ํ ๋ ๊น์ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ๋ณด๊ณ ๋ ์ฝ์ ๋ก๊ทธ์๋ง ์์กดํ๋ ๋ฐฉ์์์ ๋ฒ์ด๋ ๋ชจ๋ํฐ๋ง์ ๋ํ ์ค์ ์ง์ค์ ์ด๊ณ ์๋ํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
Reporting API๋ฅผ ์ฌ์ฉํ๋ ์ด์
Reporting API๋ ๊ธฐ์กด์ ์ค๋ฅ ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๊ธฐ์ ์ ๋นํด ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํ์คํ๋ ๋ณด๊ณ : ์ค๋ฅ ๋ฐ ์ฑ๋ฅ ๋ฐ์ดํฐ์ ๋ํ ์ผ๊ด๋ ํ์์ ์ ๊ณตํ์ฌ ๋ถ์ ๋ฐ ๊ธฐ์กด ๋ชจ๋ํฐ๋ง ์์คํ ๊ณผ์ ํตํฉ์ ๋จ์ํํฉ๋๋ค.
- ์๋ํ๋ ๋ณด๊ณ : ์๋ ์ค๋ฅ ๋ณด๊ณ ์ ํ์์ฑ์ ์ ๊ฑฐํ์ฌ ์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ๋ณด๊ณ ํ์ง ์์ ๋๋ ๋ฌธ์ ๊ฐ ํฌ์ฐฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ค์๊ฐ ๋ชจ๋ํฐ๋ง: ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๊ฑฐ์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์์ด ๊ฐ๋ฐ์๊ฐ ์ค์ํ ๋ฌธ์ ๋ฅผ ์ ์ํ๊ฒ ์๋ณํ๊ณ ํด๊ฒฐํ ์ ์์ต๋๋ค.
- ๊ฐ์ ๋ ๋๋ฒ๊น : ์คํ ํธ๋ ์ด์ค, ์ปจํ ์คํธ, ์ํฅ์ ๋ฐ๋ ์ฌ์ฉ์ ์์ด์ ํธ๋ฅผ ํฌํจํ ์ค๋ฅ์ ๋ํ ์์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ ๋ ๋น ๋ฅธ ๋๋ฒ๊น ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ์๋ณํ๊ณ ํด๊ฒฐํจ์ผ๋ก์จ Reporting API๋ ๋ ์ํํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ธฐ์ฌํฉ๋๋ค.
- ๊ธ๋ก๋ฒ ํ์ฅ์ฑ: ์ ์ธ๊ณ ์ฌ์ฉ์๋ก๋ถํฐ ๋๋์ ๋ณด๊ณ ์๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์ด ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
- ๋ณด์ ๊ณ ๋ ค ์ฌํญ: Reporting API๋ ๋ณด์์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์์ต๋๋ค. ๋ณด๊ณ ๋์์ ๋์ผ ์ถ์ฒ ์ ์ฑ (same-origin policy)์ ์ ์ฉ์ ๋ฐ์ ๋ณด๊ณ ๋ฉ์ปค๋์ฆ์ ํตํด ์ฌ์ดํธ ๊ฐ ์คํฌ๋ฆฝํ (XSS) ์ทจ์ฝ์ ์ด ์ ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Reporting API ์ค์ ํ๊ธฐ
Reporting API๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด์ผ ํ๋ ๋ณด๊ณ ์๋ํฌ์ธํธ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํตํด ์ํํ ์ ์์ต๋๋ค:
1. HTTP ํค๋:
Report-To HTTP ํค๋๋ Reporting API๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ ํธ๋๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํด ํ๋ ์ด์์ ๋ณด๊ณ ์๋ํฌ์ธํธ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๋ค์์ ์์์
๋๋ค:
Report-To: {"group":"default","max_age":31536000,"endpoints":[{"url":"https://example.com/reporting"}],"include_subdomains":true}
์ด ํค๋๋ฅผ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
- group: ๋ณด๊ณ ๊ทธ๋ฃน์ ๊ณ ์ ํ ์ด๋ฆ (์: "default").
- max_age: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๊ณ ๊ตฌ์ฑ์ ์บ์ํด์ผ ํ๋ ๊ธฐ๊ฐ(์ด ๋จ์). `max_age`๊ฐ ๊ธธ์๋ก ๊ตฌ์ฑ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ์ค๋ฒํค๋๊ฐ ์ค์ด๋ญ๋๋ค. ๊ฐ 31536000์ 1๋ ์ ๋ํ๋ ๋๋ค.
- endpoints: ๋ณด๊ณ ์๋ํฌ์ธํธ์ ๋ฐฐ์ด. ๊ฐ ์๋ํฌ์ธํธ๋ ๋ณด๊ณ ์๊ฐ ์ ์ก๋ URL์ ์ง์ ํฉ๋๋ค. ์ด์คํ๋ฅผ ์ํด ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- url: ๋ณด๊ณ ์๋ํฌ์ธํธ์ URL (์: "https://example.com/reporting"). ๋ณด์์ ์ํด HTTPS URL์ด์ด์ผ ํฉ๋๋ค.
- include_subdomains (์ ํ ์ฌํญ): ๋ณด๊ณ ๊ตฌ์ฑ์ด ํ์ฌ ๋๋ฉ์ธ์ ๋ชจ๋ ํ์ ๋๋ฉ์ธ์ ์ ์ฉ๋๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค.
2. ๋ฉํ ํ๊ทธ:
์ ํธ๋๋ ๋ฐฉ๋ฒ์ ์๋์ง๋ง, HTML์์ <meta> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ Reporting API๋ฅผ ๊ตฌ์ฑํ ์๋ ์์ต๋๋ค:
<meta http-equiv="Report-To" content='{"group":"default","max_age":31536000,"endpoints":[{"url":"https://example.com/reporting"}]}'>
์ฐธ๊ณ : <meta> ํ๊ทธ ์ ๊ทผ ๋ฐฉ์์ HTTP ํค๋๋ณด๋ค ์ ๋ขฐ์ฑ์ด ๋จ์ด์ง๊ณ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋์ง ์์ ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค. ๋ํ `include_subdomains`๋ฅผ ๊ตฌ์ฑํ ์ ์์ด ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋๋ค.
3. ์๋ฐ์คํฌ๋ฆฝํธ (์ฌ์ฉ ์ค๋จ๋จ):
์ด์ ๋ฒ์ ์ Reporting API๋ ๊ตฌ์ฑ์ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ API(navigator.reporting)๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํ์ฌ ์ฌ์ฉ ์ค๋จ๋์์ผ๋ฉฐ HTTP ํค๋๋ ๋ฉํ ํ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ณด๊ณ ์๋ํฌ์ธํธ ๊ตฌํํ๊ธฐ
๋ณด๊ณ ์๋ํฌ์ธํธ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๋ธ ๋ณด๊ณ ์๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌํ๋ ์๋ฒ ์ธก ๊ตฌ์ฑ ์์์ ๋๋ค. ๋ณด๊ณ ์๊ฐ ํจ๊ณผ์ ์ผ๋ก ์บก์ฒ๋๊ณ ๋ถ์๋๋๋ก ์ด ์๋ํฌ์ธํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ค์์ Express๋ฅผ ์ฌ์ฉํ์ฌ Node.js์์ ๋ณด๊ณ ์๋ํฌ์ธํธ๋ฅผ ๊ตฌํํ๋ ๊ธฐ๋ณธ ์์ ์ ๋๋ค:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
app.use(bodyParser.json());
app.post('/reporting', (req, res) => {
const reports = req.body;
console.log('Received reports:', JSON.stringify(reports, null, 2));
// ๋ณด๊ณ ์ ์ฒ๋ฆฌ (์: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ, ์๋ฆผ ์ ์ก)
res.status(200).send('Reports received');
});
app.listen(port, () => {
console.log(`Reporting endpoint listening at http://localhost:${port}`);
});
๋ณด๊ณ ์๋ํฌ์ธํธ ๊ตฌํ ์ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ:
- ๋ณด์: ๋ณด๊ณ ์๋ํฌ์ธํธ๊ฐ ๋ฌด๋จ ์ ๊ทผ์ผ๋ก๋ถํฐ ๋ณดํธ๋๋๋ก ํ์ญ์์ค. ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฉ์ปค๋์ฆ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ: ์ ์์ ์ด๊ฑฐ๋ ์๋ชป๋ ํ์์ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค์ด์ค๋ ๋ณด๊ณ ์ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ญ์์ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์๊ธฐ์น ์์ ๋ฌธ์ ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ์ญ์์ค.
- ํ์ฅ์ฑ: ํนํ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ด ํฐ ๊ฒฝ์ฐ ๋๋์ ๋ณด๊ณ ์๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ณด๊ณ ์๋ํฌ์ธํธ๋ฅผ ์ค๊ณํ์ญ์์ค. ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐ ์บ์ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐ์ดํฐ ์ ์ฅ: ๋ณด๊ณ ์๋ฅผ ์ํ ์ ์ ํ ์ ์ฅ ์๋ฃจ์ (์: ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ก๊ทธ ํ์ผ)์ ์ ํํ์ญ์์ค. ์ ์ฅ ์ฉ๋, ์ฑ๋ฅ, ๋น์ฉ๊ณผ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ์ฃผ์ ์ ๋ณด ์ถ์ถ, ๋ฐ์ดํฐ ์ง๊ณ, ์๋ฆผ ์์ฑ ๋ฑ ๋ณด๊ณ ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๊ตฌํํ์ญ์์ค.
- ๊ฐ์ธ์ ๋ณด ๋ณดํธ: ๋ณด๊ณ ์๋ฅผ ์์งํ๊ณ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ์ ์ ์ํ์ญ์์ค. ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๊ฐ์ธ ์๋ณ ์ ๋ณด(PII)๋ฅผ ์์งํ์ง ๋ง๊ณ , ๋ชจ๋ ๊ด๋ จ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์ (์: GDPR, CCPA)์ ์ค์ํ๋๋ก ํ์ญ์์ค.
๋ณด๊ณ ์ ์ ํ
Reporting API๋ ์ฌ๋ฌ ์ ํ์ ๋ณด๊ณ ์๋ฅผ ์ง์ํ๋ฉฐ, ๊ฐ ๋ณด๊ณ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์ ์ฑ๋ฅ์ ๋ํ ๋ค์ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
1. ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ
์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ ๋ณด๊ณ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ ๋ฐ์ํ๋ ์กํ์ง ์์ ์์ธ ๋ฐ ๊ตฌ๋ฌธ ์ค๋ฅ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ๋ฉ์์ง, ์คํ ํธ๋ ์ด์ค, ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ค ๋ฒํธ๊ฐ ํฌํจ๋ฉ๋๋ค.
๋ณด๊ณ ์ ์์:
{
"age": 483,
"body": {
"columnNumber": 7,
"filename": "https://example.com/main.js",
"lineNumber": 10,
"message": "Uncaught TypeError: Cannot read properties of null (reading 'length')",
"scriptSampleBytes": 48,
"stacktrace": "TypeError: Cannot read properties of null (reading 'length')\n at https://example.com/main.js:10:7",
"type": "javascript-error"
},
"type": "error",
"url": "https://example.com/",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36"
}
์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ๋ฉด ์ฝ๋์ ๋ฒ๊ทธ๋ฅผ ์๋ณํ๊ณ ์์ ํ๋ฉฐ, ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๊ณ , ์ฌ์ฉ์๊ฐ ๊ฒช๋ ์ค๋ฅ ์๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
2. ์ฌ์ฉ ์ค๋จ ๋ณด๊ณ ์
์ฌ์ฉ ์ค๋จ ๋ณด๊ณ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ ์ค๋จ๋ ์น ํ๋ซํผ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๋ํ๋ ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ ํฅํ ๋ธ๋ผ์ฐ์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ณด๊ณ ์ ์์:
{
"age": 123,
"body": {
"anticipatedRemoval": "101",
"id": "NavigatorVibrate",
"message": "Navigator.vibrate() is deprecated and will be removed in M101, around March 2022. See https://developer.chrome.com/blog/remove-deprecated-web-features/#navigatorvibrate for more details.",
"sourceFile": "https://example.com/main.js",
"lineNumber": 25,
"columnNumber": 10,
"type": "deprecation"
},
"type": "deprecation",
"url": "https://example.com/",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36"
}
์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๋ฅผ ํด๊ฒฐํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์งํํ๋ ์น ํ์ค๊ณผ ํธํ๋๋๋ก ์ ์งํ๊ณ ํฅํ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค.
3. ๊ฐ์ ๋ณด๊ณ ์
๊ฐ์ ๋ณด๊ณ ์๋ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์์ ํ๊ฑฐ๋ ๋ณด์ ์ ์ฑ ์ ์ํํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ทจํ ์กฐ์น๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์ด๋ป๊ฒ ์์ ํ๊ณ ์๋์ง ์ดํดํ๊ณ ๊ฐ์ ํ ์ ์๋ ์ ์ฌ์ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ณด๊ณ ์ ์์:
{
"age": 789,
"body": {
"id": "ForceLayoutAvoidance",
"message": "Layout was forced before the page was fully loaded. If your site looks broken, try adding a \"display:none\" style to the tag.",
"sourceFile": "https://example.com/",
"lineNumber": 100,
"columnNumber": 5,
"type": "intervention"
},
"type": "intervention",
"url": "https://example.com/",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36"
}
๊ฐ์ ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ ํผํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
4. CSP ์๋ฐ ๋ณด๊ณ ์
CSP(์ฝํ ์ธ ๋ณด์ ์ ์ฑ ) ์๋ฐ ๋ณด๊ณ ์๋ ๋ฆฌ์์ค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด ์ ์๋ CSP ๊ท์น์ ์๋ฐํ ๋ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ ์ฌ์ดํธ ๊ฐ ์คํฌ๋ฆฝํ (XSS) ๊ณต๊ฒฉ์ ์๋ณํ๊ณ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
CSP ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ฐ์ผ๋ ค๋ฉด Content-Security-Policy ๋๋ Content-Security-Policy-Report-Only HTTP ํค๋๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint;
๋ณด๊ณ ์ ์์:
{
"csp-report": {
"document-uri": "https://example.com/",
"referrer": "",
"violated-directive": "default-src 'self'",
"effective-directive": "default-src",
"original-policy": "default-src 'self'; report-uri /csp-report-endpoint;",
"blocked-uri": "https://evil.com/malicious.js",
"status-code": 200
}
}
CSP ์๋ฐ ๋ณด๊ณ ์๋ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ๋ํ ๊ท์คํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ํ์ธ๋ฅผ ๊ฐํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
5. ๋คํธ์ํฌ ์ค๋ฅ ๋ก๊น (NEL)
๋คํธ์ํฌ ์ค๋ฅ ๋ก๊น (NEL) ๊ธฐ๋ฅ์ Reporting API์ ํจ๊ป ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, ์ฌ์ฉ์๊ฐ ๊ฒช๋ ๋คํธ์ํฌ ์ค๋ฅ์ ๋ํ ์ ๋ณด๋ฅผ ์บก์ฒํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ `NEL` HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ๋ฉ๋๋ค.
NEL: {"report_to": "default", "max_age": 2592000}
NEL ๋ณด๊ณ ์ ์์(Reporting API๋ฅผ ํตํด ์ ์ก๋จ):
{
"age": 5,
"type": "network-error",
"url": "https://example.com/image.jpg",
"body": {
"type": "dns.name_not_resolved",
"protocol": "http/1.1",
"elapsed_time": 123,
"phase": "dns"
}
}
NEL ๋ณด๊ณ ์๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋ฌธ์ , CDN ๋ฌธ์ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น๋ ๊ธฐํ ์ธํ๋ผ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
Reporting API ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Reporting API์ ์ด์ ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ๋ณด๊ณ ์๋ํฌ์ธํธ์ HTTPS ์ฌ์ฉ: ๋ณด๊ณ ์๊ฐ ์์ ํ๊ฒ ์ ์ก๋๊ณ ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ํญ์ ๋ณด๊ณ ์๋ํฌ์ธํธ์ HTTPS๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์๋ ์ ํ ๊ตฌํ: ๋จ์ฉ์ ๋ฐฉ์งํ๊ณ ๊ณผ๋ํ ๋ณด๊ณ ์๋ก ์ธํด ์๋ฒ๊ฐ ์๋๋๋ ๊ฒ์ ๋ณดํธํ๊ธฐ ์ํด ๋ณด๊ณ ์๋ํฌ์ธํธ์ ์๋ ์ ํ์ ๊ตฌํํ์ญ์์ค.
- ๋ณด๊ณ ์ ๋ณผ๋ฅจ ๋ชจ๋ํฐ๋ง: ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ ์ด์ ํ์์ ์๋ณํ๊ธฐ ์ํด ์์ ํ๋ ๋ณด๊ณ ์์ ์์ ๋ชจ๋ํฐ๋งํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ค๋ฅ ๋ณด๊ณ ์๊ฐ ๊ฐ์๊ธฐ ๊ธ์ฆํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๊ฐํ ๋ฒ๊ทธ๊ฐ ์์์ ๋ํ๋ผ ์ ์์ต๋๋ค.
- ๋ณด๊ณ ์ ๋ถ์ ์ฐ์ ์์ ์ง์ : ์ฌ๊ฐ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฏธ์น๋ ์ํฅ์ ๋ฐ๋ผ ๋ณด๊ณ ์ ๋ถ์์ ์ฐ์ ์์๋ฅผ ์ ํ์ญ์์ค. ์ค์ํ ์ค๋ฅ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ํด๊ฒฐํ๋ ๋ฐ ๋จผ์ ์ง์คํ์ญ์์ค.
- ๊ธฐ์กด ๋ชจ๋ํฐ๋ง ์์คํ ๊ณผ ํตํฉ: Reporting API๋ฅผ ๊ธฐ์กด ๋ชจ๋ํฐ๋ง ์์คํ ๊ณผ ํตํฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ฐ ์ฑ๋ฅ์ ๋ํ ํฌ๊ด์ ์ธ ์์ผ๋ฅผ ์ ๊ณตํ์ญ์์ค.
- ์์ค ๋งต ์ฌ์ฉ: ์์ค ๋งต์ ์ฌ์ฉํ์ฌ ์ถ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์๋ณธ ์์ค ์ฝ๋๋ก ๋ค์ ๋งคํํ์ฌ Reporting API์์ ๋ณด๊ณ ๋ ์ค๋ฅ๋ฅผ ๋ ์ฝ๊ฒ ๋๋ฒ๊น ํ ์ ์๋๋ก ํ์ญ์์ค.
- ์ฌ์ฉ์์๊ฒ ์๋ฆผ(์ ์ ํ ๊ฒฝ์ฐ): ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ง์ ๊ฐ์ ํ๊ธฐ ์ํด ์ค๋ฅ ๋ณด๊ณ ์๋ฅผ ์์งํ๊ณ ์์์ ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๋ ๊ฒ์ด ์ ์ ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์์ง ๊ดํ์ ๋ํด ํฌ๋ช ํ๊ฒ ๊ณต๊ฐํ๊ณ ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ์กด์คํ์ญ์์ค.
- ๋ณด๊ณ ๊ตฌํ ํ ์คํธ: ๋ณด๊ณ ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์บก์ฒ๋๊ณ ์ฒ๋ฆฌ๋๋์ง ํ์ธํ๊ธฐ ์ํด ๋ณด๊ณ ๊ตฌํ์ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค. ๋ค์ํ ์ค๋ฅ ์กฐ๊ฑด์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ๋ณด๊ณ ์๊ฐ ์์ฑ๋์ด ๋ณด๊ณ ์๋ํฌ์ธํธ๋ก ์ ์ก๋๋์ง ํ์ธํ์ญ์์ค.
- ๋ฐ์ดํฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ์ ์ ์: ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋ณด๊ณ ์์ ๊ฐ์ธ ์๋ณ ์ ๋ณด(PII)๋ฅผ ์์งํ์ง ๋ง์ญ์์ค. ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ต๋ช ํํ๊ฑฐ๋ ์ญ์ ํ์ญ์์ค.
- ์ํ๋ง ๊ณ ๋ ค: ํธ๋ํฝ์ด ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์์ง๋๋ ๋ฐ์ดํฐ ์์ ์ค์ด๊ธฐ ์ํด ์ค๋ฅ ๋ณด๊ณ ์๋ฅผ ์ํ๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๋ค์ํ ์ค๋ฅ ์ ํ๊ณผ ์ฌ์ฉ์ ์ธ๊ทธ๋จผํธ์ ๋ํ ๋ํ์ ์ธ ๋ฒ์๋ฅผ ๋ณด์ฅํ๋ ์ํ๋ง ์ ๋ต์ ๊ตฌํํ์ญ์์ค.
์ค์ ์ฌ๋ก ๋ฐ ์ฌ๋ก ์ฐ๊ตฌ
์ฌ๋ฌ ํ์ฌ๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ์ฑ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด Reporting API๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ตฌํํ์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์์ ๋๋ค:
- Facebook: Facebook์ ์น์ฌ์ดํธ ๋ฐ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ ๋ฐ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํด Reporting API๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Google: Google์ ๋ค์ํ ์น ์์ฐ์์ CSP ์๋ฐ ๋ฐ ๊ธฐํ ๋ณด์ ๊ด๋ จ ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํด Reporting API๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Mozilla: Mozilla๋ Firefox ์น ๋ธ๋ผ์ฐ์ ์์ ์ถฉ๋ ๋ณด๊ณ ์๋ฅผ ์์งํ๊ธฐ ์ํด Reporting API๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฌํ ์๋ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ๋ณด์์ ์ํฅ์ ๋ฏธ์น๋ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ์์ด Reporting API์ ํจ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Reporting API์ ๋ฏธ๋
Reporting API๋ ์น ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์ ๋ณํํ๋ ์๊ตฌ๋ฅผ ์ถฉ์กฑ์ํค๊ธฐ ์ํด ๋์์์ด ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ํฅํ ๊ฐ์ ์ฌํญ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ์๋ก์ด ๋ณด๊ณ ์ ์ ํ ์ง์: ์ฑ๋ฅ ๋ฉํธ๋ฆญ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ ๋ฐ์ดํฐ์ ๊ฐ์ ์๋ก์ด ์ ํ์ ๋ณด๊ณ ์์ ๋ํ ์ง์ ์ถ๊ฐ.
- ๊ฐ์ ๋ ๋ณด๊ณ ๊ตฌ์ฑ: ๋ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค์ ๋๊ตฌ๋ฅผ ํตํด Reporting API ๊ตฌ์ฑ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํ.
- ๊ฐํ๋ ๋ณด์ ๊ธฐ๋ฅ: ๋จ์ฉ์ ๋ฐฉ์งํ๊ณ ๋ฐ์ดํฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ ์๋ก์ด ๋ณด์ ๊ธฐ๋ฅ ์ถ๊ฐ.
๊ฒฐ๋ก
Reporting API๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ค๋ฅ ๋ฐ ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ํ์คํ๋๊ณ ์๋ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ์ผ๋ก์จ Reporting API๋ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น๋ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ์๋ณํ๊ณ ํด๊ฒฐํ ์ ์๋๋ก ํฉ๋๋ค. Reporting API๋ฅผ ๊ตฌํํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ๋ขฐํ ์ ์์ผ๋ฉฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด ๊ธฐ์ ์ ์ฑํํ์ฌ ์ฌ์ฉ์์ ์์น๋ ์ฅ์น์ ๊ด๊ณ์์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๋๋ก ํ์ญ์์ค.
Reporting API๋ฅผ ๊ตฌํํ ๋๋ ํญ์ ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ์ ๋ณด์์ ์ต์ฐ์ ์ผ๋ก ์๊ฐํด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ ์์ง ๊ดํ์ ๋ํด ํฌ๋ช ํ๊ฒ ๊ณต๊ฐํ๊ณ ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๊ฐ์ธ ์๋ณ ์ ๋ณด๋ฅผ ์์งํ์ง ๋ง์ญ์์ค. ์ ์คํ ๊ณํ๊ณผ ๊ตฌํ์ ํตํด Reporting API๋ ์น ๊ฐ๋ฐ ํดํท์์ ๊ท์คํ ์์ฐ์ด ๋ ์ ์์ต๋๋ค.